#include <stdio.h>

typedef int bool;
#define true 1
#define false 0
#define MAXSIZE 12500

typedef struct
{
    int row, col;
    int value;
}Triple;
 
typedef struct
{
    Triple data[MAXSIZE + 1]; // 一维数组
    int rows, cols, nums;  //矩阵的行数，列数和非零元素个数
}Matrix;


int main()
{
	Matrix m, t, M;
	int r, c, k;	// c代表列，r代表行
	int i, j;
	int count = 0;
	int zero = 0;
	scanf("%d %d", &r, &c);
	m.rows = r;
	m.cols = c;
	t.rows = c;
	t.cols = r;
	for (i = 0; i < m.rows; i++)
		for (j = 0; j < m.cols; j++)
		{
			scanf("%d", &k);
			if (k != 0)
			{
				m.data[count].value = k;
				m.data[count].row = i;
				m.data[count].col = j;
				t.data[count].value = k;
				t.data[count].row = j;
				t.data[count].col = i;
				count++;
			}
		} 
	m.nums = count;
	t.nums = count;
	// printf("%d\n", count);
	
	bool flag;
 
	for(i = 0; i < t.rows; i++)
	{
		for(j = 0; j < t.cols; j++)
		{
			flag = false;  //非0标记
			// 挨个遍历，搜索出，而非先排序
			for(k = 0; k < t.nums; k++)
			{
				if(i == t.data[k].row && j == t.data[k].col)
				{
					printf("%d ", t.data[k].value);
					flag = true;
					break;
				}
			}
			if(flag == false)
			{
				printf("0 ");
			}
		}
		printf("\n");
	}
 
	printf("\n");
	// printf("%d\n", t.nums);
    return 0;
}


